package logic

import (
	"fmt"
	"github.com/eatmoreapple/openwechat"
	"roc/wechat/global"
	"roc/wechat/utils"
)

var userMsgMap = map[string]interface{}{}

// Dispatch
// @Description: 消息处理
// @param msg
//func Dispatch(msg *openwechat.Message) {
//	self, err := msg.Bot().GetCurrentUser()
//	if err != nil {
//		fmt.Println("获取当前用户失败")
//		return
//	}
//	if self.NickName != "随心所玉" {
//		fmt.Println("当前不是用户：随心所玉；忽略消息")
//		return
//	}
//
//	if msg.IsText() && msg.Content == "ping" {
//		msg.ReplyText("pong")
//	}
//	fmt.Println(msg)
//	fmt.Println(msg.Content)
//	fmt.Println(msg.FromUserName)
//	fmt.Println(msg.ToUserName)
//	user, err := msg.Sender()
//	if err != nil {
//		fmt.Println("获取失败")
//		return
//	}
//	fmt.Println(user)
//	fmt.Println(user.NickName)
//	fmt.Println(user.UserName)
//
//	// 个人白名单
//	if utils.InArray(user.NickName, global.CONFIG.Wechat.PersonalWhiteList) {
//		userBuilder, ok := userMsgMap[user.UserName]
//		if !ok {
//			userBuilder = moonshot.GetDefaultBuilder()
//		}
//
//		userBuilder.AddUserContent(msg.Content)
//		resp, userBuilder, tmpErr := moonshot.Chat(msg.Content, userBuilder)
//		if tmpErr != nil {
//			msg.ReplyText(tmpErr.Error())
//			err = tmpErr
//			return
//		}
//		userMsgMap[user.UserName] = userBuilder
//		msg.ReplyText(resp)
//	}
//	return
//}

// Dispatch
// @Description: 消息处理
// @param msg
func Dispatch(msg *openwechat.Message) {
	self, err := msg.Bot().GetCurrentUser()
	if err != nil {
		fmt.Println("获取当前用户失败")
		return
	}
	if self.NickName != "随心所玉" {
		fmt.Println("当前不是用户：随心所玉；忽略消息")
		return
	}

	//if msg.IsText() && msg.Content == "ping" {
	//	msg.ReplyText("pong")
	//}

	//fmt.Println(msg)
	//fmt.Println(msg.Content)
	//fmt.Println(msg.FromUserName)
	//fmt.Println(msg.ToUserName)

	// 获取消息发送者
	fromUser, err := msg.Sender()
	if err != nil {
		fmt.Println("获取失败")
		return
	}
	fmt.Println("消息来源：", fromUser.NickName)
	//fmt.Println(fromUser.UserName)

	// 判断消息是否由群聊发出
	isGroup := msg.IsSendByGroup()

	// 群组消息处理
	if isGroup {
		handleByGroup(msg, fromUser)
		return
	}

	// 个人消息处理
	handleByPersonal(msg, fromUser)

	return
}

func handleByGroup(msg *openwechat.Message, fromUser *openwechat.User) {
	fromGroup := openwechat.Group{fromUser}

	// 获取消息的接收者
	//receiver, err := msg.Receiver()
	//if err != nil {
	//	return
	//}
	//fmt.Println("获取消息的接收者:", receiver)

	// 自己发的消息也过滤，不处理，立马返回
	if msg.IsSelfSendToGroup() {
		return
	}
	// 如果不是@自己，那么就不处理，立马返回
	if !msg.IsAt() {
		return
	}

	// 获取消息在群里面的发送者
	sender, err := msg.SenderInGroup()
	if err != nil {
		return
	}
	fmt.Println("获取消息在群里面的发送者:", sender)

	// 如果不是白名单，那么就不处理，立马返回
	if !utils.InArray(fromGroup.NickName, global.CONFIG.Wechat.RoomWhiteList) {
		return
	}

	fmt.Println("group start")
	if msg.IsText() {
		resp := handleTextByGroup(msg, fromUser)
		if resp != `` {
			// 
			//"\u2005"
			msg.ReplyText("@" + openwechat.FormatEmoji(sender.NickName) + " " + resp)
		}
	} else if msg.IsPicture() {
		// 图片
		resp, tmpErr := msg.GetPicture()
		if tmpErr != nil {
			fmt.Println("图片下载失败：", tmpErr.Error())
		}
		utils.DownloadByResp(global.CONFIG.Serve.StaticDir+utils.GetRandString(32), resp)
	} else if msg.IsVideo() {
		// 视频
		resp, tmpErr := msg.GetVideo()
		if tmpErr != nil {
			fmt.Println("视频下载失败：", tmpErr.Error())
		}
		utils.DownloadByResp(global.CONFIG.Serve.StaticDir+utils.GetRandString(32), resp)

	} else if msg.IsVoice() {
		// 语音
		resp, tmpErr := msg.GetVoice()
		if tmpErr != nil {
			fmt.Println("视频下载失败：", tmpErr.Error())
		}

		utils.DownloadByResp(global.CONFIG.Serve.StaticDir+utils.GetRandString(32), resp)
	} else if msg.IsVoipInvite() {
		// 语音或者视频邀请

	} else if msg.IsPaiYiPai() {
		msg.ReplyText("拍我干嘛呢，记小本本上了")
	}
}

func handleByPersonal(msg *openwechat.Message, fromUser *openwechat.User) {
	// 自己发的消息也过滤，不处理，立马返回
	if msg.IsSendBySelf() {
		return
	}

	// 如果不在个人白名单，不处理，立马返回
	if !utils.InArray(fromUser.NickName, global.CONFIG.Wechat.PersonalWhiteList) {
		return
	}

	fmt.Println("start")
	if msg.IsText() {
		handleText(msg, fromUser)
	} else if msg.IsPicture() {
		// 图片
		resp, tmpErr := msg.GetPicture()
		if tmpErr != nil {
			fmt.Println("图片下载失败：", tmpErr.Error())
		}
		utils.DownloadByResp(global.CONFIG.Serve.StaticDir+utils.GetRandString(32), resp)
	} else if msg.IsVideo() {
		// 视频
		resp, tmpErr := msg.GetVideo()
		if tmpErr != nil {
			fmt.Println("视频下载失败：", tmpErr.Error())
		}
		utils.DownloadByResp(global.CONFIG.Serve.StaticDir+utils.GetRandString(32), resp)

	} else if msg.IsVoice() {
		// 语音
		resp, tmpErr := msg.GetVoice()
		if tmpErr != nil {
			fmt.Println("视频下载失败：", tmpErr.Error())
		}
		utils.DownloadByResp(global.CONFIG.Serve.StaticDir+utils.GetRandString(32), resp)
	} else if msg.IsVoipInvite() {
		// 语音或者视频邀请

	} else if msg.IsPaiYiPai() {
		msg.ReplyText("拍我干嘛呢，记小本本上了")
	}

}

// handleText
// @Description: 文本消息处理
// @param msg
// @param fromUser
func handleText(msg *openwechat.Message, fromUser *openwechat.User) {
	//return
	var err error
	defer func() {
		if err != nil {
			fmt.Println("err:", err)
		}
	}()
	userBuilder, ok := userMsgMap[fromUser.UserName]

	if !ok {
		userBuilder = global.AiClient.GetDefaultInfo()
	}

	resp, userBuilder, tmpErr := global.AiClient.Chat(msg.Content, userBuilder)
	if tmpErr != nil {
		msg.ReplyText(tmpErr.Error())
		err = tmpErr
		return
	}
	userMsgMap[fromUser.UserName] = userBuilder
	msg.ReplyText(resp)

	return
}

// handleTextByGroup
// @Description: 群内文本消息处理
// @param msg
// @param fromUser
func handleTextByGroup(msg *openwechat.Message, fromUser *openwechat.User) (resp string) {
	//return
	var err error
	defer func() {
		if err != nil {
			fmt.Println("err:", err)
		}
	}()
	userBuilder, ok := userMsgMap[fromUser.UserName]

	if !ok {
		userBuilder = global.AiClient.GetDefaultInfo()
	}

	//@Bot 怎么理解房奴
	resp, userBuilder, tmpErr := global.AiClient.Chat(msg.Content, userBuilder)
	if tmpErr != nil {
		msg.ReplyText(tmpErr.Error())
		err = tmpErr
		return
	}
	userMsgMap[fromUser.UserName] = userBuilder

	return
}
